#include <QQmlApplicationEngine>
#include <QGuiApplication>
#include <QQmlContext>
#include <QFile>
#include <QResource>
#include <QImage>
#include <QtQuickControls2/QQuickStyle>
#include "include/ros_worker.h"
#include "include/heartbeat_model.h"
#include "include/heartbeat_listener.h"
#include "include/hik_camera_controller.h"
#include "include/mapdata.h"
#include "include/seer/RobotController.h"
#include "src/sensor_data_subscriber.h"
#include "include/global_logger.h"
//#include "src/robot_status_client.h"
//#include "src/map_download_action_client.h"
#include "include/db/database_manager.h"
#include "src/task_client_factory.h"
#include "include/file_loader.h"

int main(int argc, char* argv[]) {
    // 初始化日志系统
    GlobalLogger::getInstance().initialize("data/logs", "RMSMaster", 5);

    rclcpp::init(argc, argv);
    QGuiApplication app(argc, argv);
    QQuickStyle::setStyle("Material");  // 设置QML样式

    // 创建QQmlApplicationEngine实例，用于管理和运行QML应用程序
    QQmlApplicationEngine engine;
    
    /**
    * 创建心跳模型实例，用于存储和显示心跳数据
    */
    LOG_DEBUG("创建心跳模型实例");
    HeartbeatModel model;
    engine.rootContext()->setContextProperty("heartbeatModel", &model);     // 将HeartbeatModel实例暴露给QML，以便在QML中访问和使用
    
    // 加载QML主文件，启动QML界面
    engine.load("qrc:/qml/main.qml");
    
    /**
    * 创建数据库管理器实例，用于管理数据库
    */
    DatabaseManager dbManager;
    engine.rootContext()->setContextProperty("databaseManager", &dbManager);

    /**
    * 创建HikCameraController实例，用于控制和管理海康摄像头(云台控制)
    */
    /*
    LOG_DEBUG("创建HikCameraController实例");
    HikCameraController hikController;  
    engine.rootContext()->setContextProperty("hikController", &hikController);  // 将HikCameraController实例暴露给QML，以便在QML中进行摄像头控制
    */
    /**
    * 创建MapData实例，用于在地图上显示数据
    */
    LOG_DEBUG("创建MapData实例");
    MapData mapData;
    engine.rootContext()->setContextProperty("mapData", &mapData);          // 将MapData实例暴露给QML，以便在QML中展示地图数据

    /**
    * 创建机器人控制器RobotController实例，用于控制SRC2000机器人
    */
    LOG_DEBUG("创建机器人控制器RobotController实例");
    RobotController robotController;
    engine.rootContext()->setContextProperty("robotController", &robotController);
    
    /**
    * 创建环境传感器HCD5014数据订阅器
    */
    LOG_DEBUG("创建环境传感器数据订阅器");
    SensorDataSubscriber sensorSubscriber;
    engine.rootContext()->setContextProperty("sensorSubscriber", &sensorSubscriber);     // 将传感器数据订阅器暴露给QML
    sensorSubscriber.start();       //启动HCD5014传感器数据订阅器

    /**
    * 创建并启动ROS心跳监听线程
    */
    LOG_DEBUG("创建并启动ROS心跳监听线程");
    ROSWorker worker(&model);
    worker.start();
   /* 
    // 将RobotStatusClient实例暴露给QML
    engine.rootContext()->setContextProperty("robotStatusClient", worker.robotStatusClient());
    // 将MapDownloadActionClient实例暴露给QML
    engine.rootContext()->setContextProperty("mapDownloadClient", worker.mapDownloadClient());
    
    // 设置地图下载客户端
    worker.robotStatusClient()->setMapDownloadClient(
        std::shared_ptr<MapDownloadActionClient>(worker.mapDownloadClient(), [](MapDownloadActionClient*){}));
    */

    // 注册TaskClientFactory到QML
    TaskClientFactory* taskClientFactory = new TaskClientFactory(&worker, &engine);
    engine.rootContext()->setContextProperty("taskClientFactory", taskClientFactory);

    // 将TaskClientNode实例暴露给QML
    //engine.rootContext()->setContextProperty("taskClientNode", worker.taskClientNode());

    /*
    * 注册文件加载器
    */
    engine.rootContext()->setContextProperty("fileLoader", new FileLoader(&engine));

    
    // 连接心跳监听器的心跳信号到模型的处理心跳槽函数
    QObject::connect(
        worker.listener(),
        &HeartbeatListener::heartbeatSignal,
        &model,
        &HeartbeatModel::handleHeartbeatSlot,
        Qt::QueuedConnection
    );

   // 建立信号与槽的连接，用于处理心跳超时检查请求
    QObject::connect(
        worker.listener(), // 发送信号的对象：工作者的心跳监听器
        &HeartbeatListener::timeoutCheckRequestedSignal, // 发送的信号：心跳超时检查请求信号
        &model, // 接收信号的对象：心跳模型
        &HeartbeatModel::checkTimeoutSlot, // 接收的槽：检查心跳超时的槽函数
        Qt::QueuedConnection // 连接类型：队列连接，确保信号在接收对象的事件循环中处理
    );
    
  
    // 建立信号和槽的连接，用于在接收到心跳信号时更新机器人状态
    QObject::connect(
        worker.listener(), // 发送信号的对象，此处为worker的listener方法返回的对象
        &HeartbeatListener::heartbeatSignal, // 发送的信号，HeartbeatListener类中的heartbeatSignal信号
        &mapData, // 接收信号的对象，此处为mapData对象
        &MapData::updateRobot, // 接收的槽，MapData类中的updateRobot方法
        Qt::QueuedConnection // 连接类型，使用队列连接，确保信号在接收对象的事件循环中处理
    );
    
    // 启动事件循环
    LOG_DEBUG("启动事件循环");
    int ret = app.exec();
    worker.stop();  // 安全停止线程
    rclcpp::shutdown();
    return ret;
}